/**
 * @file constants.h
 * @brief 104协议常量定义
 * @author 电网104协议开发团队
 * @date 2024
 */

#ifndef CONSTANTS_H
#define CONSTANTS_H

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 协议常量 ==================== */

/**
 * @brief APDU常量
 */
#define APDU_START_CHAR                0x68    /* 启动字符 */
#define APDU_MAX_LENGTH                253     /* APDU最大长度 */
#define APDU_MIN_LENGTH                4       /* APDU最小长度 */
#define APDU_CONTROL_FIELD_SIZE        4       /* 控制域大小 */

/**
 * @brief ASDU常量
 */
#define ASDU_MAX_LENGTH                249     /* ASDU最大长度 */
#define ASDU_HEADER_SIZE               6       /* ASDU头部大小 */
#define ASDU_COMMON_ADDRESS_SIZE       2       /* 公共地址大小 */
#define ASDU_INFO_ADDRESS_SIZE         3       /* 信息对象地址大小 */

/**
 * @brief 序列号常量
 */
#define MAX_SEND_SEQUENCE_NUMBER       32767   /* 最大发送序列号 */
#define MAX_RECEIVE_SEQUENCE_NUMBER    32767   /* 最大接收序列号 */
#define SEQUENCE_NUMBER_MODULO         32768   /* 序列号模数 */
#define SEQUENCE_NUMBER_MASK           0x7FFF  /* 序列号掩码 */

/**
 * @brief 超时常量 (秒)
 */
#define TIMEOUT_T0_MIN                 1       /* 建立连接超时最小值 */
#define TIMEOUT_T0_MAX                 255     /* 建立连接超时最大值 */
#define TIMEOUT_T1_MIN                 1       /* 发送或测试APDU超时最小值 */
#define TIMEOUT_T1_MAX                 255     /* 发送或测试APDU超时最大值 */
#define TIMEOUT_T2_MIN                 1       /* 无数据报文时确认超时最小值 */
#define TIMEOUT_T2_MAX                 255     /* 无数据报文时确认超时最大值 */
#define TIMEOUT_T3_MIN                 1       /* 长期空闲状态下发送测试帧超时最小值 */
#define TIMEOUT_T3_MAX                 255     /* 长期空闲状态下发送测试帧超时最大值 */

/* 默认超时值 (秒) */
#define TIMEOUT_T0_DEFAULT             30      /* 建立连接超时默认值 */
#define TIMEOUT_T1_DEFAULT             15      /* 发送或测试APDU超时默认值 */
#define TIMEOUT_T2_DEFAULT             10      /* 无数据报文时确认超时默认值 */
#define TIMEOUT_T3_DEFAULT             20      /* 长期空闲状态下发送测试帧超时默认值 */

/**
 * @brief 缓冲区常量
 */
#define MAX_UNACKNOWLEDGED_I_FRAMES    12      /* 最大未确认I格式帧数 */
#define MAX_UNACKNOWLEDGED_RECEIVE     8       /* 最大未确认接收帧数 */

/**
 * @brief 端口常量
 */
#define DEFAULT_PORT                   2404    /* 默认端口号 */

/* ==================== 地址范围常量 ==================== */

/**
 * @brief 信息对象地址范围 (1997版)
 */
#define ADDR_TELEMETRY_START_1997      0x0001  /* 遥信地址起始 */
#define ADDR_TELEMETRY_END_1997        0x0400  /* 遥信地址结束 */
#define ADDR_ANALOG_START_1997         0x0701  /* 遥测地址起始 */
#define ADDR_ANALOG_END_1997           0x0900  /* 遥测地址结束 */
#define ADDR_CONTROL_START_1997        0x0B01  /* 控制地址起始 */
#define ADDR_CONTROL_END_1997          0x0B80  /* 控制地址结束 */

/**
 * @brief 信息对象地址范围 (2002版)
 */
#define ADDR_TELEMETRY_START_2002      0x0001  /* 遥信地址起始 */
#define ADDR_TELEMETRY_END_2002        0x4000  /* 遥信地址结束 */
#define ADDR_ANALOG_START_2002         0x4001  /* 遥测地址起始 */
#define ADDR_ANALOG_END_2002           0x5000  /* 遥测地址结束 */
#define ADDR_CONTROL_START_2002        0x6001  /* 控制地址起始 */
#define ADDR_CONTROL_END_2002          0x6100  /* 控制地址结束 */
#define ADDR_ENERGY_START_2002         0x6401  /* 电能量地址起始 */
#define ADDR_ENERGY_END_2002           0x6600  /* 电能量地址结束 */
#define ADDR_PARAMETER_START_2002      0x8001  /* 参数地址起始 */
#define ADDR_PARAMETER_END_2002        0x9000  /* 参数地址结束 */

/**
 * @brief 公共地址范围
 */
#define COMMON_ADDR_MIN                1       /* 最小公共地址 */
#define COMMON_ADDR_MAX                65535   /* 最大公共地址 */

/**
 * @brief CP56Time2a时间戳常量
 */
#define CP56TIME2A_SIZE               7       /* CP56Time2a时间戳大小 */
#define CP56TIME2A_YEAR_BASE          2000    /* 年份基准 */
#define CP56TIME2A_MAX_YEAR           99      /* 最大年份 */
#define CP56TIME2A_MAX_MONTH          12      /* 最大月份 */
#define CP56TIME2A_MAX_DAY            31      /* 最大日期 */
#define CP56TIME2A_MAX_HOUR           23      /* 最大小时 */
#define CP56TIME2A_MAX_MINUTE         59      /* 最大分钟 */
#define CP56TIME2A_MAX_MILLISECOND    59999   /* 最大毫秒 */

/* ==================== 数据类型常量 ==================== */

/**
 * @brief 类型标识常量
 */
#define TYPE_ID_SINGLE_POINT           1       /* 单点信息 */
#define TYPE_ID_DOUBLE_POINT           3       /* 双点信息 */
#define TYPE_ID_MEASUREMENT_NORMALIZED 9       /* 测量值，归一化值 */
#define TYPE_ID_MEASUREMENT_SCALED     11      /* 测量值，标度化值 */
#define TYPE_ID_MEASUREMENT_SHORT_FLOAT 13     /* 测量值，短浮点数 */
#define TYPE_ID_SINGLE_POINT_SOE       30      /* 单点SOE */
#define TYPE_ID_DOUBLE_POINT_SOE       31      /* 双点SOE */
#define TYPE_ID_FAULT_EVENT            42      /* 故障事件信息 */
#define TYPE_ID_SINGLE_COMMAND         45      /* 单点命令 */
#define TYPE_ID_DOUBLE_COMMAND         46      /* 双点命令 */
#define TYPE_ID_CLOCK_SYNC             103     /* 时钟同步命令 */
#define TYPE_ID_TOTAL_INTERROGATION    100     /* 总召唤命令 */
#define TYPE_ID_ENERGY_INTERROGATION  101     /* 电能量召唤命令 */
#define TYPE_ID_TEST_COMMAND           104     /* 测试命令 */
#define TYPE_ID_RESET_PROCESS          105     /* 复位进程命令 */
#define TYPE_ID_SWITCH_SETTING_AREA    200     /* 切换定值区 */
#define TYPE_ID_READ_SETTING_AREA     201     /* 读定值区号 */
#define TYPE_ID_READ_PARAMETER        202     /* 读参数和定值 */
#define TYPE_ID_WRITE_PARAMETER       203     /* 写参数和定值 */
#define TYPE_ID_ENERGY_SHORT_FLOAT    206     /* 累计量，短浮点数 */
#define TYPE_ID_ENERGY_TIMESTAMP      207     /* 带时标累计量，短浮点数 */
#define TYPE_ID_FILE_TRANSFER         210     /* 文件传输 */
#define TYPE_ID_SOFTWARE_UPGRADE      211     /* 软件升级 */

/**
 * @brief 传送原因常量
 */
#define COT_PERIODIC                   1       /* 周期/循环 */
#define COT_BACKGROUND_SCAN           2       /* 背景扫描 */
#define COT_SPONTANEOUS               3       /* 突发(自发) */
#define COT_INITIALIZATION            4       /* 初始化 */
#define COT_REQUEST                   5       /* 请求/被请求 */
#define COT_ACTIVATION                6       /* 激活 */
#define COT_ACTIVATION_CONFIRM        7       /* 激活确认 */
#define COT_DEACTIVATION              8       /* 停止激活 */
#define COT_DEACTIVATION_CONFIRM      9       /* 停止激活确认 */
#define COT_ACTIVATION_TERMINATION    10      /* 激活终止 */
#define COT_REMOTE_COMMAND            11      /* 远方命令引起的返送信息 */
#define COT_LOCAL_COMMAND             12      /* 当地命令引起的返送信息 */
#define COT_FILE_TRANSFER             13      /* 文件传输 */
#define COT_RESPONSE_STATION_INTERROGATION 20 /* 响应站召唤 */
#define COT_RESPONSE_GROUP1           21      /* 响应第1组召唤 */
#define COT_RESPONSE_GROUP2           22      /* 响应第2组召唤 */
#define COT_RESPONSE_GROUP3           23      /* 响应第3组召唤 */
#define COT_RESPONSE_GROUP4           24      /* 响应第4组召唤 */
#define COT_RESPONSE_GROUP5           25      /* 响应第5组召唤 */
#define COT_RESPONSE_GROUP6           26      /* 响应第6组召唤 */
#define COT_RESPONSE_GROUP7           27      /* 响应第7组召唤 */
#define COT_RESPONSE_GROUP8           28      /* 响应第8组召唤 */
#define COT_RESPONSE_GROUP9           29      /* 响应第9组召唤 */
#define COT_RESPONSE_GROUP10          30      /* 响应第10组召唤 */
#define COT_RESPONSE_GROUP11          31      /* 响应第11组召唤 */
#define COT_RESPONSE_GROUP12          32      /* 响应第12组召唤 */
#define COT_RESPONSE_GROUP13          33      /* 响应第13组召唤 */
#define COT_RESPONSE_GROUP14          34      /* 响应第14组召唤 */
#define COT_RESPONSE_GROUP15          35      /* 响应第15组召唤 */
#define COT_RESPONSE_GROUP16          36      /* 响应第16组召唤 */
#define COT_UNKNOWN_TYPE_ID           44      /* 未知的类型标识 */
#define COT_UNKNOWN_TRANSMISSION_CAUSE 45     /* 未知的传送原因 */
#define COT_UNKNOWN_COMMON_ADDRESS    46      /* 未知的应用服务数据单元公共地址 */
#define COT_UNKNOWN_INFO_ADDRESS      47      /* 未知的信息对象地址 */
#define COT_REMOTE_CONTROL_SOFT_PLATE_ERROR 48 /* 遥控执行软压板状态错误 */
#define COT_REMOTE_CONTROL_TIMESTAMP_ERROR 49 /* 遥控执行时间戳错误 */
#define COT_REMOTE_CONTROL_SIGNATURE_ERROR 50 /* 遥控执行数字签名认证错误 */

/* ==================== 品质描述词常量 ==================== */

/**
 * @brief 品质描述词位定义
 */
#define QUALITY_IV_BIT                 0x01    /* 无效位 */
#define QUALITY_NT_BIT                 0x02    /* 非当前位 */
#define QUALITY_SB_BIT                 0x04    /* 取代位 */
#define QUALITY_BL_BIT                 0x08    /* 闭锁位 */
#define QUALITY_OV_BIT                 0x10    /* 溢出位 */

/**
 * @brief 品质描述词值
 */
#define QUALITY_GOOD                   0x00    /* 品质良好 */
#define QUALITY_INVALID                0x01    /* 无效 */
#define QUALITY_NON_CURRENT            0x02    /* 非当前 */
#define QUALITY_SUBSTITUTED            0x04    /* 取代 */
#define QUALITY_BLOCKED                0x08    /* 闭锁 */
#define QUALITY_OVERFLOW               0x10    /* 溢出 */

/* ==================== 时间常量 ==================== */

/**
 * @brief CP56Time2a时间常量
 */
#define CP56TIME2A_SIZE               7       /* CP56Time2a大小 */
#define CP56TIME2A_YEAR_BASE          2000     /* 年份基准 */
#define CP56TIME2A_MAX_YEAR           99       /* 最大年份 (0-99表示2000-2099) */
#define CP56TIME2A_MAX_MONTH          12       /* 最大月份 */
#define CP56TIME2A_MAX_DAY            31       /* 最大日期 */
#define CP56TIME2A_MAX_HOUR           23       /* 最大小时 */
#define CP56TIME2A_MAX_MINUTE         59       /* 最大分钟 */
#define CP56TIME2A_MAX_SECOND         59       /* 最大秒 */
#define CP56TIME2A_MAX_MILLISECOND    59999    /* 最大毫秒 */

/**
 * @brief QOI限定词定义
 */
#define QOI_UNUSED                    0       /* 未用 */
#define QOI_COMPANION_STANDARD_MIN    1       /* 配套标准保留最小值 */
#define QOI_COMPANION_STANDARD_MAX    19      /* 配套标准保留最大值 */
#define QOI_ENTIRE_STATION            20      /* 整个站的总召唤 */
#define QOI_SPECIAL_PURPOSE_MIN       21      /* 特殊用途保留最小值 */
#define QOI_SPECIAL_PURPOSE_MAX       255     /* 特殊用途保留最大值 */

#ifdef __cplusplus
}
#endif

#endif /* CONSTANTS_H */
